<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  
  <title>一个获取主机IP地址的命令解释-awk、gensub | rongshen</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  
  
  
<link rel="stylesheet" href="/css/style.css">

  
    
<link rel="stylesheet" href="/css/highlight.css">

  
  <meta name="description" content="今天在看师兄写的一个安装脚本文件，虽然之前学了不少bash知识。不是太熟练，打算练练手，可是这个命令折磨了我好久。索性花点时间把它弄清楚。awk这个工具语言的难度，我是体会到了。写正则表达式的都是什么人啊。。。佩服！！！">
<meta property="og:type" content="article">
<meta property="og:title" content="一个获取主机IP地址的命令解释-awk、gensub">
<meta property="og:url" content="http://example.com/2020/04/25/%E4%B8%80%E4%B8%AA%E8%8E%B7%E5%8F%96%E4%B8%BB%E6%9C%BAIP%E5%9C%B0%E5%9D%80%E7%9A%84%E5%91%BD%E4%BB%A4%E8%A7%A3%E9%87%8A-awk%E3%80%81gensub/index.html">
<meta property="og:site_name" content="rongshen">
<meta property="og:description" content="今天在看师兄写的一个安装脚本文件，虽然之前学了不少bash知识。不是太熟练，打算练练手，可是这个命令折磨了我好久。索性花点时间把它弄清楚。awk这个工具语言的难度，我是体会到了。写正则表达式的都是什么人啊。。。佩服！！！">
<meta property="og:locale" content="en_US">
<meta property="og:image" content="http://cdn.rongshen2020.com/%E5%9B%BE%E7%89%87111.png">
<meta property="og:image" content="http://cdn.rongshen2020.com/%E5%9B%BE%E7%89%87211.png">
<meta property="og:image" content="http://cdn.rongshen2020.com/%E5%9B%BE%E7%89%87311.png">
<meta property="og:image" content="http://cdn.rongshen2020.com/%E5%9B%BE%E7%89%87411.png">
<meta property="og:image" content="http://cdn.rongshen2020.com/%E5%9B%BE%E7%89%875.png">
<meta property="og:image" content="http://cdn.rongshen2020.com/%E5%9B%BE%E7%89%876.png">
<meta property="article:published_time" content="2020-04-25T15:25:08.000Z">
<meta property="article:modified_time" content="2020-05-06T02:59:18.702Z">
<meta property="article:author" content="John Doe">
<meta property="article:tag" content="awk">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="http://cdn.rongshen2020.com/%E5%9B%BE%E7%89%87111.png"><meta name="generator" content="Hexo 6.1.0"></head>

<body>
  <div id="wrapper">
    <header id="header">
  <h1 id="title">
    <a href="/">rongshen</a>
  </h1>
  <nav>
    
    
      
      <a class="nav-link" href="/">Home</a>
    
      
        <span class="nav-spacer">×</span>
      
      <a class="nav-link" href="/archives">Archives</a>
    
      
        <span class="nav-spacer">×</span>
      
      <a class="nav-link" target="_blank" rel="noopener" href="https://github.com/Aaron-boom">Github</a>
    
      
        <span class="nav-spacer">×</span>
      
      <a class="nav-link" href="/2020/04/13/About-Me/">About</a>
    
    
  </nav>
</header>

    <div id="content">
      <article id="post-一个获取主机IP地址的命令解释-awk、gensub" class="article article-type-post" itemprop="blogPost" itemscope>
  <div class="article-inner">
    
      <header class="article-header">
        
  
    <h2 class="article-title" itemprop="headline name">
      一个获取主机IP地址的命令解释-awk、gensub
    </h2>
  


        <div class="article-meta">
          <time class="article-date" datetime="2020-04-25T15:25:08.000Z" itemprop="datePublished">2020-04-25</time>

          
        </div>
      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
      
        <blockquote>
<p>今天在看师兄写的一个安装脚本文件，虽然之前学了不少bash知识。不是太熟练，打算练练手，可是这个命令折磨了我好久。索性花点时间把它弄清楚。awk这个工具语言的难度，我是体会到了。写正则表达式的都是什么人啊。。。佩服！！！</p>
</blockquote>
<span id="more"></span>
<h1 id="一个获取ip地址的命令详解，涉及awk知识和gensub函数"><a href="#一个获取ip地址的命令详解，涉及awk知识和gensub函数" class="headerlink" title="一个获取ip地址的命令详解，涉及awk知识和gensub函数"></a>一个获取ip地址的命令详解，涉及awk知识和gensub函数</h1><h2 id="1、先上命令"><a href="#1、先上命令" class="headerlink" title="1、先上命令"></a>1、先上命令</h2><pre><code class="bash">MyIpAddr=$(ip addr | awk &#39;/^[0-9]+: / &#123;&#125;; /inet.*global/ &#123;print gensub(/(.*)\/(.*)/, &quot;\\1&quot;, &quot;g&quot;, $2)&#125;&#39;|head -1)
</code></pre>
<h3 id="1-1、先看下它得出的结果吧："><a href="#1-1、先看下它得出的结果吧：" class="headerlink" title="1.1、先看下它得出的结果吧："></a>1.1、先看下它得出的结果吧：</h3><p><img src="http://cdn.rongshen2020.com/%E5%9B%BE%E7%89%87111.png"></p>
<p><img src="http://cdn.rongshen2020.com/%E5%9B%BE%E7%89%87211.png"></p>
<ul>
<li>就是这个命令，折磨了我很久。我们来思考它是怎么获取到你的主机IP地址的？反向推理一波，一边猜测，一边解题。。。</li>
</ul>
<h3 id="1-2、我们先来拆分下这个命令："><a href="#1-2、我们先来拆分下这个命令：" class="headerlink" title="1.2、我们先来拆分下这个命令："></a>1.2、我们先来拆分下这个命令：</h3><ul>
<li>拆分是为了帮助我们更好的化繁为简，其他的命令我就不解释了。主要围绕awk和gensub这两个进行解释。<pre><code class="bash">ip addr | awk &#39;/^[0-9]+: / &#123;&#125;; /inet.*global/ &#123;print gensub(/(.*)\/(.*)/, &quot;\\1&quot;, &quot;g&quot;, $2)&#125;&#39;|head -1
</code></pre>
<pre><code class="bash">awk &#39;/^[0-9]+: / &#123;&#125;; /inet.*global/ &#123;print gensub(/(.*)\/(.*)/, &quot;\\1&quot;, &quot;g&quot;, $2)&#125;&#39;
</code></pre>
<h2 id="2、awk和genden函数的解释"><a href="#2、awk和genden函数的解释" class="headerlink" title="2、awk和genden函数的解释"></a>2、awk和genden函数的解释</h2><h3 id="2-1、awk命令解释，擅长列输出。awk的一般语法格式为："><a href="#2-1、awk命令解释，擅长列输出。awk的一般语法格式为：" class="headerlink" title="2.1、awk命令解释，擅长列输出。awk的一般语法格式为："></a>2.1、awk命令解释，擅长列输出。awk的一般语法格式为：</h3><img src="http://cdn.rongshen2020.com/%E5%9B%BE%E7%89%87311.png"></li>
</ul>
<pre><code>awk [-参数 变量] &#39;BEGIN&#123;初始化&#125;条件类型1&#123;动作1&#125;条件类型2&#123;动作2&#125;。。。。END&#123;后处理&#125;&#39;
</code></pre>
<ul>
<li>pattern+action</li>
</ul>
<pre><code>条件类型1是/^[0-9]+: /，你要知道正则表达式要写在/ /双斜杠这个里面。那么他是用一个正则表达式来作为一个条件类型。
动作1是&#123;&#125;，里面是空的。
继续...
条件类型2是/inet.*global/
动作2是&#123;print gensub(/(.*)\/(.*)/, &quot;\\1&quot;, &quot;g&quot;, $2)&#125;，他用这个print加上gensub函数作为动作。
关于这个分号 ; 分号只是起到一个分隔作用，表示分号前和分号后没有联系。
</code></pre>
<h3 id="2-2、gensub函数命令解释："><a href="#2-2、gensub函数命令解释：" class="headerlink" title="2.2、gensub函数命令解释："></a>2.2、gensub函数命令解释：</h3><p><strong>gensub(a,b,c[,d])全局替换，匹配正则表达式a， 用b替换，c为指定替换目标是第几次匹配（”g”:表示全局替换），d为指定替换目标是哪个域如$1,$2，若无d指$0，返回值为target替换后内容(未替换还是返回target原内容)与sub、gsub不同的是，target内容替换后不变。</strong></p>
<h3 id="2-3、简单测试下，帮助更好的了解命令干了什么，之后反推下："><a href="#2-3、简单测试下，帮助更好的了解命令干了什么，之后反推下：" class="headerlink" title="2.3、简单测试下，帮助更好的了解命令干了什么，之后反推下："></a>2.3、简单测试下，帮助更好的了解命令干了什么，之后反推下：</h3><ul>
<li>我们先用pattern1来测试下匹配，可以看到得到了两个网卡信息：<br><img src="http://cdn.rongshen2020.com/%E5%9B%BE%E7%89%87411.png"></li>
<li>继续看下图，继续做一个pattern2的匹配看下：<br><img src="http://cdn.rongshen2020.com/%E5%9B%BE%E7%89%875.png"></li>
<li>可以看到里面有我们最终的ip地址了，那么之后就是action2里面的print和gensub的事了。</li>
<li><code>gensub(/(.*)\/(.*)/, &quot;\\1&quot;, &quot;g&quot;, $2)</code>那么这个到底是干了什么呢？</li>
<li>之前我提到了gensub的函数命令解释，那么可以推测gensub就是把IP地址从下面图中的句子里提炼出来：<br><img src="http://cdn.rongshen2020.com/%E5%9B%BE%E7%89%876.png"></li>
</ul>
<p><strong>我们再来对genden做一个详细的解释：</strong></p>
<ul>
<li><code>(.*)\/(.*)</code> 这个的意思是 括号1&#x2F;括号2，括号里面有两个一模一样的正则表达式。匹配出了192.168.3.11&#x2F;24</li>
<li><code>“//1”</code>表示引用第一个括号例匹配的内容，也就是192.168.3.11，用它来替换，也就是192.168.3.11&#x2F;24变成了192.168.3.11</li>
<li><code>“g”</code>表示全局替换。</li>
<li><code>$2</code>表示第二个域。其中inet是第一个域里面，192.168.3.11在第二个域里面，brd在第三个域里面。。。</li>
</ul>
<h3 id="你可以尝试将"><a href="#你可以尝试将" class="headerlink" title="你可以尝试将"></a>你可以尝试将</h3><pre><code class="bash">MyIpAddr=&quot;inet 192.168.3.11/24 brd 192.168.3.255 scope global&quot;
echo $&#123;MyIpAddr&#125; &gt;&gt; test1.txt
awk &#39;&#123;print gensub(/(.*)\/(.*)/,&quot;\\1&quot;,&quot;g&quot;,$2)&#125;&#39; test1.txt
</code></pre>
<ul>
<li>多做几次试验。。。</li>
</ul>
<h1 id="后记："><a href="#后记：" class="headerlink" title="后记："></a>后记：</h1><ul>
<li><code>^[0-9]+   </code>表示匹配输入字符串开始的位置，匹配多个数字。 ^ 为匹配输入字符串的开始位置。[0-9]+匹配多个数字， [0-9] 匹配单个数字，+ 匹配一个或者多个。</li>
<li><code>runoo*b</code>，可以匹配 runob、runoob、runoooooob 等，* 号代表字符可以不出现，也可以出现一次或者多次（0次、或1次、或多次）。</li>
</ul>

      
    </div>
    
    
    <div class="article-category">
      
        <b>Categories:</b>
        <a class="article-category-link" href="/categories/linux/">linux</a>
      
      
        <br/>
      
      
        <b>Tags:</b>
        <a class="article-tag-none-link" href="/tags/awk/" rel="tag">awk</a>
      
    </div>
    
    
  </div>
</article>

  
<nav id="article-nav" class="article-nav">
  
    <a href="/2020/04/26/%E6%AE%8B%E5%B7%AE%E7%BD%91%E7%BB%9C%E4%B9%8B%E5%BF%AB%E6%8D%B7%E9%94%AE-ResNet%E3%80%81skip-connection/" id="article-nav-newer" class="article-nav-link-wrap newer">
      <strong class="article-nav-caption">Newer</strong>
      <div class="article-nav-title">
        
          残差网络之快捷键-ResNet,skip connection
        
      </div>
    </a>
  
  
    <a href="/2020/04/24/CDH%E5%B9%B3%E5%8F%B0%E5%BF%AB%E9%80%9F%E6%90%AD%E5%BB%BA-%E5%87%86%E5%A4%87%E5%92%8C%E7%AE%80%E4%BB%8B/" id="article-nav-older" class="article-nav-link-wrap older">
      <strong class="article-nav-caption">Older</strong>
      <div class="article-nav-title">
        
          CDH平台快速搭建-准备和简介
        
      </div>
    </a>
  
</nav>






    </div>
  </div>
  




<div id="settings-container">
  <div id="dark-mode">dark</div>
  <div id="sans-font">sans</div>
</div>
<script type="text/javascript">
let d=document,r=d.documentElement.style,f=r.setProperty.bind(r),l=localStorage,s=l.getItem('s')||(window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches),n=l.getItem('n'),m=d.getElementById("dark-mode"),b=()=>{f('--bg-color','#fafafa');f('--code-bg-color','#f4f4f4');f('--text-color','#212121');f('--secondary-color','#808080');f('--tertiary-color','#b0b0b0');f('--link-color','#b5c8cf');f('--link-hover-color','#618794');f('--link-bg-color','#dae4e7');f('--selection-color','#dae4e7');m.innerHTML="dark"},c=()=>{f('--bg-color','#212121');f('--code-bg-color','#292929');f('--text-color','#fff');f('--secondary-color','#c0c0c0');f('--tertiary-color','#6e6e6e');f('--link-color','#4d6b75');f('--link-hover-color','#96b1bb');f('--link-bg-color','#5d828e');f('--selection-color','#acc1c9');m.innerHTML="light"},o=d.getElementById("sans-font"),e=()=>{f('--body-stack','"Lora", "Georgia", "Times New Roman", serif');o.innerHTML="sans"},g=()=>{f('--body-stack','"Lato", "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", "Verdana", sans-serif');o.innerHTML="serif"};m.onclick=()=>{if(s==2){s=1;l.setItem('s',s);c()}else{s=2;l.setItem('s',s);b()}};o.onclick=()=>{if(n==2){n=1;l.setItem('n',n);g()}else{n=2;l.setItem('n',n);e()}};if(!s){s=2;l.setItem('s',2)};if(s==1){c()};if(!n){n=2;l.setItem('n',2)};if(n==1){g()};
</script>




</body>
</html>
